/**
 *    Copyright ${license.git.copyrightYears} the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.mybatis.generator.internal.rules;

import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;

/**
 * This interface centralizes all the rules related to code generation - including the methods and objects to create,
 * and certain attributes related to those objects.
 * 
 * @author Jeff Butler
 */
public interface Rules {

  /**
   * Implements the rule for generating the insert SQL Map element and DAO method. If the insert statement is allowed,
   * then generate the element and method.
   * 
   * @return true if the element and method should be generated
   */
  boolean generateInsert();

  /**
   * Implements the rule for generating the insert selective SQL Map element and DAO method. If the insert statement is
   * allowed, then generate the element and method.
   * 
   * @return true if the element and method should be generated
   */
  boolean generateInsertSelective();

  /**
   * Calculates the class that contains all fields. This class is used as the insert statement parameter, as well as the
   * returned value from the select by primary key method. The actual class depends on how the domain model is
   * generated.
   * 
   * @return the type of the class that holds all fields
   */
  FullyQualifiedJavaType calculateAllFieldsClass();

  /**
   * Implements the rule for generating the update by primary key without BLOBs SQL Map element and DAO method. If the
   * table has a primary key as well as other non-BLOB fields, and the updateByPrimaryKey statement is allowed, then
   * generate the element and method.
   * 
   * @return true if the element and method should be generated
   */
  boolean generateUpdateByPrimaryKeyWithoutBLOBs();

  /**
   * Implements the rule for generating the update by primary key with BLOBs SQL Map element and DAO method. If the
   * table has a primary key as well as other BLOB fields, and the updateByPrimaryKey statement is allowed, then
   * generate the element and method.
   * 
   * @return true if the element and method should be generated
   */
  boolean generateUpdateByPrimaryKeyWithBLOBs();

  /**
   * Implements the rule for generating the update by primary key selective SQL Map element and DAO method. If the table
   * has a primary key as well as other fields, and the updateByPrimaryKey statement is allowed, then generate the
   * element and method.
   * 
   * @return true if the element and method should be generated
   */
  boolean generateUpdateByPrimaryKeySelective();

  /**
   * Implements the rule for generating the delete by primary key SQL Map element and DAO method. If the table has a
   * primary key, and the deleteByPrimaryKey statement is allowed, then generate the element and method.
   * 
   * @return true if the element and method should be generated
   */
  boolean generateDeleteByPrimaryKey();

  /**
   * Implements the rule for generating the delete by example SQL Map element and DAO method. If the deleteByExample
   * statement is allowed, then generate the element and method.
   * 
   * @return true if the element and method should be generated
   */
  boolean generateDeleteByExample();

  /**
   * Implements the rule for generating the result map without BLOBs. If either select method is allowed, then generate
   * the result map.
   * 
   * @return true if the result map should be generated
   */
  boolean generateBaseResultMap();

  /**
   * Implements the rule for generating the result map with BLOBs. If the table has BLOB columns, and either select
   * method is allowed, then generate the result map.
   * 
   * @return true if the result map should be generated
   */
  boolean generateResultMapWithBLOBs();

  /**
   * Implements the rule for generating the SQL example where clause element.
   * 
   * In iBATIS2, generate the element if the selectByExample, deleteByExample, updateByExample, or countByExample
   * statements are allowed.
   * 
   * In MyBatis3, generate the element if the selectByExample, deleteByExample, or countByExample statements are
   * allowed.
   * 
   * @return true if the SQL where clause element should be generated
   */
  boolean generateSQLExampleWhereClause();

  /**
   * Implements the rule for generating the SQL example where clause element specifically for use in the update by
   * example methods.
   * 
   * In iBATIS2, do not generate the element.
   * 
   * In MyBatis, generate the element if the updateByExample statements are allowed.
   * 
   * @return true if the SQL where clause element should be generated
   */
  boolean generateMyBatis3UpdateByExampleWhereClause();

  /**
   * Implements the rule for generating the SQL base column list element. Generate the element if any of the select
   * methods are enabled.
   * 
   * @return true if the SQL base column list element should be generated
   */
  boolean generateBaseColumnList();

  /**
   * Implements the rule for generating the SQL blob column list element. Generate the element if any of the select
   * methods are enabled, and the table contains BLOB columns.
   * 
   * @return true if the SQL blob column list element should be generated
   */
  boolean generateBlobColumnList();

  /**
   * Implements the rule for generating the select by primary key SQL Map element and DAO method. If the table has a
   * primary key as well as other fields, and the selectByPrimaryKey statement is allowed, then generate the element and
   * method.
   * 
   * @return true if the element and method should be generated
   */
  boolean generateSelectByPrimaryKey();

  /**
   * Implements the rule for generating the select by example without BLOBs SQL Map element and DAO method. If the
   * selectByExample statement is allowed, then generate the element and method.
   * 
   * @return true if the element and method should be generated
   */
  boolean generateSelectByExampleWithoutBLOBs();

  /**
   * Implements the rule for generating the select by example with BLOBs SQL Map element and DAO method. If the table
   * has BLOB fields and the selectByExample statement is allowed, then generate the element and method.
   * 
   * @return true if the element and method should be generated
   */
  boolean generateSelectByExampleWithBLOBs();

  /**
   * Implements the rule for generating an example class. The class should be generated if the selectByExample or
   * deleteByExample or countByExample methods are allowed.
   * 
   * @return true if the example class should be generated
   */
  boolean generateExampleClass();

  boolean generateCountByExample();

  boolean generateUpdateByExampleSelective();

  boolean generateUpdateByExampleWithoutBLOBs();

  boolean generateUpdateByExampleWithBLOBs();

  /**
   * Implements the rule for determining whether to generate a primary key class. If you return false from this method,
   * and the table has primary key columns, then the primary key columns will be added to the base class.
   * 
   * @return true if a separate primary key class should be generated
   */
  boolean generatePrimaryKeyClass();

  /**
   * Implements the rule for generating a base record.
   * 
   * @return true if the class should be generated
   */
  boolean generateBaseRecordClass();

  /**
   * Implements the rule for generating a record with BLOBs. If you return false from this method, and the table had
   * BLOB columns, then the BLOB columns will be added to the base class.
   * 
   * @return true if the record with BLOBs class should be generated
   */
  boolean generateRecordWithBLOBsClass();

  /**
   * Implements the rule for generating a Java client. This rule is only active when a javaClientGenerator configuration
   * has been specified, but the table is designated as "modelOnly". Do not generate the client if the table is
   * designated as modelOnly.
   * 
   * @return true if the Java client should be generated
   */
  boolean generateJavaClient();

  IntrospectedTable getIntrospectedTable();
}
